home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fatted Calf
/
The Fatted Calf.iso
/
Applications
/
Audio
/
Patchmix
/
XWindowsSource
/
unit_gen.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-28
|
12KB
|
411 lines
static char rcsid[] = "$Header: unit_gen.c,v 1.7 91/02/13 09:46:41 mara Exp $";
/* unit_gen.c
*
* Written by Mara Helmuth
*
* Description: unit_generator class for cmix X graphical interface
*
* $Log: unit_gen.c,v $
* Revision 1.7 91/02/13 09:46:41 mara
* panel fixes
*
* Revision 1.6 90/10/11 10:32:00 mara
* am fix
*
* Revision 1.5 90/09/08 12:49:54 mara
* side panel for input amps
*
* Revision 1.4 90/09/07 20:50:46 mara
* fm
*
* Revision 1.3 90/09/05 22:10:53 mara
* many fixes, +,-,*,/ ugens added
*
* Revision 1.2 90/09/02 18:19:25 mara
* NeXT fixes
*
* Revision 1.1 90/08/27 17:09:50 mara
* Initial revision
*
*/
#include "plus.h"
unit_generator::unit_generator()
{
sprintf(file,"Newinst/%s.c",inst.name);
fp = fopen(file, "a");
if(!fp)
perror(file);
beg_int = inst.num_ints;
beg_float = inst.num_sfloats;
beg_float_ptr = inst.num_float_ptrs;
}
void unit_generator::write_oscil(int p, int l, int r)
{
// create instrument variables
sprintf(inst.ints[inst.num_ints++],"len%d",p);
sprintf(inst.ints[inst.num_ints++],"wave%d",p);
sprintf(inst.sfloats[inst.num_sfloats++],"ug%d",p); // 0
sprintf(inst.sfloats[inst.num_sfloats++],"amp%d",p); // 1
sprintf(inst.sfloats[inst.num_sfloats++],"si%d",p); // 2
sprintf(inst.sfloats[inst.num_sfloats++],"phase%d",p); // 3
sprintf(inst.float_ptrs[inst.num_float_ptrs++],"f%d",p);
strcpy(oscil_type,"oscili");
sprintf(amp_var,"%s",inst.sfloats[beg_float+1]);
sprintf(si_var,"%s",inst.sfloats[beg_float + 2]);
// create instrument commands
sprintf(cmd,"%s = 1;\n",inst.ints[beg_int+1]); // wave
inst.cmd_list.append(cmd);
if(l > 0) { // there is an input ugen to amplitude - ring mod
sprintf(cmd,"%s = %.2f;\n",inst.sfloats[beg_float+1],
atof(ugen[p].oscil->amp->value));
// amp? = ?;
inst.loop_list.append(cmd);
sprintf(amp_var,"ampam%d",p);
strcpy(inst.sfloats[inst.num_sfloats++],amp_var);
sprintf(cmd,"%s = %s * ug%d;\n",amp_var,
inst.sfloats[beg_float+1],l);
inst.loop_list.append(cmd);
}
else if(l < 0) // amp is a pfield for this oscil
;
else { // amp is preset or default
sprintf(cmd,"%s = %.2f;\n",inst.sfloats[beg_float+1],
atof(ugen[p].oscil->amp->value));
inst.loop_list.append(cmd);
}
if(r < 0) { // oscil.freq is not set--make a pfield
inst.pfield++;
sprintf(cmd,"%s = p[%d]*fsize(1)/SR;\n",
inst.sfloats[beg_float+2], inst.pfield);
inst.p[inst.pfield] = 260;
}
else if(r == 0) { // oscil.freq is preset
sprintf(cmd,"%s = %.2f*fsize(1)/SR;\n",inst.sfloats[beg_float+2], atof(ugen[p].oscil->freq->value));
}
else {
printf("fm selected\n");
strcpy(oscil_type,"oscilni");
sprintf(si_var,"sifm%d",p);
strcpy(inst.sfloats[inst.num_sfloats++],si_var);
sprintf(cmd,"%s = si%d + ug%d * len%d/SR;\n", si_var,p,r,p);
inst.loop_list.append(cmd);
sprintf(cmd,"si%d = %.2f*fsize(1)/SR;\n",p,
atof(ugen[p].oscil->freq->value),p);
}
inst.cmd_list.append(cmd);
sprintf(cmd,"%s = 0.;\n",inst.sfloats[beg_float+3]);
inst.cmd_list.append(cmd);
sprintf(cmd,"%s = fsize(%s);\n",inst.ints[beg_int],inst.ints[beg_int+1]);
inst.cmd_list.append(cmd);
sprintf(cmd,"%s = (float *)floc(%s);\n",inst.float_ptrs[beg_float_ptr],inst.ints[beg_int+1]);
inst.cmd_list.append(cmd);
sprintf(cmd, "%s = %s(%s,%s,%s,%s,&%s);\n",inst.sfloats[beg_float], \
oscil_type,amp_var,si_var,\
inst.float_ptrs[beg_float_ptr],inst.ints[beg_int], \
inst.sfloats[beg_float+3]);
inst.loop_list.append(cmd);
// declare instrument variables
declare(beg_int, beg_float, beg_float_ptr);
}
void unit_generator::write_evp(int p, int l, int r)
{
// create instrument variables
sprintf(inst.ints[inst.num_ints++],"nfrise%d",p);
sprintf(inst.sfloats[inst.num_sfloats++],"ug%d",p); // 0
sprintf(inst.sfloats[inst.num_sfloats++],"amp%d",p); // 1
sprintf(inst.sfloats[inst.num_sfloats++],"dur%d",p); // 2
sprintf(inst.sfloats[inst.num_sfloats++],"rise%d",p); // 3
sprintf(inst.sfloats[inst.num_sfloats++],"decay%d",p); // 4
sprintf(inst.sfloats[inst.num_sfloats++],"q%d",p); // 5
// q[9] should be declared, q used in evset
sprintf(inst.float_ptrs[inst.num_float_ptrs++],"f1_%d",p);
sprintf(inst.float_ptrs[inst.num_float_ptrs++],"f2_%d",p);
// create instrument commands
sprintf(cmd,"%s = %f;\n",inst.sfloats[beg_float+1],atof(ugen[p].evp->amp->value));
inst.cmd_list.append(cmd);
sprintf(cmd,"%s = %d;\n",inst.ints[beg_int],atoi(ugen[p].evp->nfunc->value)+2); // function for rise (& decay)
inst.cmd_list.append(cmd);
sprintf(cmd,"%s = %f;\n",inst.sfloats[beg_float+3],atof(ugen[p].evp->rise->value));
inst.cmd_list.append(cmd);
sprintf(cmd,"%s = %f;\n",inst.sfloats[beg_float+4],atof(ugen[p].evp->decay->value));
inst.cmd_list.append(cmd);
sprintf(cmd,"evset(p[1],%s,%s,%s,%s);\n",inst.sfloats[beg_float+3],inst.sfloats[beg_float+4],inst.ints[beg_int],inst.sfloats[beg_float+5]);
inst.cmd_list.append(cmd);
sprintf(cmd,"%s = (float *)floc(%s);\n",inst.float_ptrs[beg_float_ptr],inst.ints[beg_int]);
inst.cmd_list.append(cmd);
sprintf(cmd,"%s = %s;\n",inst.float_ptrs[beg_float_ptr+1],inst.float_ptrs[beg_float_ptr]);
inst.cmd_list.append(cmd);
if(l > 0) { // there is an input ugen to amplitude
/*
sprintf(cmd,"%s = %.2f;\n",inst.sfloats[beg_float+1],
atof(ugen[p].evp->amp->value));
// amp? = ?;
inst.loop_list.append(cmd);
sprintf(amp_var,"ampam%d",p);
sprintf(cmd,"%s = %s * ug%d;\n",inst.sfloats[beg_float],
inst.sfloats[beg_float+1],l);
inst.loop_list.append(cmd);
*/
}
else if(l < 0) // amp is a pfield for this evp
;
else { // amp is preset or default
sprintf(cmd,"%s = %.2f;\n",inst.sfloats[beg_float],
atof(ugen[p].evp->amp->value));
inst.loop_list.append(cmd);
}
if(r < 0) {
}
/*
else if(r == 0) { // evp.rise is preset
sprintf(cmd,"%s = %.3f;\n",inst.sfloats[beg_float+2], atof(ugen[p].evp->rise->value));
}
*/
inst.cmd_list.append(cmd);
sprintf(cmd, "%s = evp(i,%s,%s,%s);\n",inst.sfloats[beg_float], \
inst.float_ptrs[beg_float_ptr], \
inst.float_ptrs[beg_float_ptr+1], inst.sfloats[beg_float+5]);
inst.loop_list.append(cmd);
// declare instrument variables
strcat(inst.sfloats[beg_float+5],"[9]"); // for array declaration
declare(beg_int, beg_float, beg_float_ptr);
}
void unit_generator::write_buzz(int p, int l, int r)
{
char buzz_type[20];
// create instrument variables
sprintf(inst.ints[inst.num_ints++],"wave%d",p);
sprintf(inst.sfloats[inst.num_sfloats++],"ug%d",p); // 0
sprintf(inst.sfloats[inst.num_sfloats++],"amp%d",p); // 1
sprintf(inst.sfloats[inst.num_sfloats++],"si%d",p); // 2
sprintf(inst.sfloats[inst.num_sfloats++],"nhar%d",p); // 3
sprintf(inst.sfloats[inst.num_sfloats++],"phase%d",p); // 4
sprintf(inst.float_ptrs[inst.num_float_ptrs++],"f%d",p); //farray
strcpy(buzz_type,"buzz");
sprintf(amp_var,"%s",inst.sfloats[beg_float+1]);
sprintf(si_var,"%s",inst.sfloats[beg_float + 2]);
// create instrument commands
sprintf(cmd,"%s = 1;\n",inst.ints[beg_int]); // wave
inst.cmd_list.append(cmd);
if(l > 0) { // there is an input ugen to amplitude
sprintf(cmd,"%s = %.2f;\n",inst.sfloats[beg_float+1],
atof(ugen[p].buzz->amp->value));
// amp? = ?;
inst.loop_list.append(cmd);
sprintf(amp_var,"ampam%d",p);
strcpy(inst.sfloats[inst.num_sfloats++],amp_var);
sprintf(cmd,"%s = %s * ug%d;\n",amp_var,
inst.sfloats[beg_float+1],l);
inst.loop_list.append(cmd);
}
else if(l < 0) // amp is a pfield for this buzz
;
else { // amp is preset or default
sprintf(cmd,"%s = %.2f;\n",inst.sfloats[beg_float+1],
atof(ugen[p].buzz->amp->value));
inst.loop_list.append(cmd);
}
if(r < 0) { // buzz.freq is not set--make a pfield
inst.pfield++;
sprintf(cmd,"%s = p[%d]*fsize(1)/SR;\n",
inst.sfloats[beg_float+2], inst.pfield);
inst.p[inst.pfield] = 260;
}
else if(r == 0) { // buzz.freq is preset
sprintf(cmd,"%s = %.2f*fsize(1)/SR;\n",inst.sfloats[beg_float+2], atof(ugen[p].buzz->freq->value));
}
else {
printf("fm selected - doesn't work\n");
}
inst.cmd_list.append(cmd);
sprintf(cmd,"%s = 0.;\n",inst.sfloats[beg_float+4]); // phase
inst.cmd_list.append(cmd);
sprintf(cmd,"%s = (float *)floc(%s);\n",inst.float_ptrs[beg_float_ptr],inst.ints[beg_int]);
inst.cmd_list.append(cmd);
sprintf(cmd,"%s = %.2f;\n",inst.sfloats[beg_float+3],
atof(ugen[p].buzz->nhar->value));
inst.cmd_list.append(cmd);
sprintf(cmd, "%s = %s(%s,%s,%s,%s,&%s);\n",inst.sfloats[beg_float], \
buzz_type,amp_var,si_var, inst.sfloats[beg_float+3], \
inst.float_ptrs[beg_float_ptr], inst.sfloats[beg_float+4]);
inst.loop_list.append(cmd);
// declare instrument variables
declare(beg_int, beg_float, beg_float_ptr);
}
void unit_generator::write_add(int p, int l, int r)
{
fprintf(fp, "\tfloat ug%d;\n",p);
declare(beg_int, beg_float, beg_float_ptr);
float l_fact, r_fact;
l_fact = atof(ugen[p].side->in0->value);
r_fact = atof(ugen[p].side->in1->value);
if(l && r)
sprintf(cmd, "ug%d = %f * ug%d + %f * ug%d;\n",
p, l_fact, l, r_fact, r);
else if(l)
sprintf(cmd, "ug%d = %f * ug%d;\n", p, l_fact, l);
else if(r)
sprintf(cmd, "ug%d = %f * ug%d;\n", p, r_fact, r);
else
sprintf(cmd, "ug%d = 0.;\n", p);
inst.loop_list.append(cmd);
}
void unit_generator::write_rand(int p, int l, int r)
{
fprintf(fp, "\tfloat ug%d;\n",p);
declare(beg_int, beg_float, beg_float_ptr);
sprintf(cmd, "ug%d = rrand();\n", p);
inst.loop_list.append(cmd);
}
void unit_generator::write_sub(int p, int l, int r)
{
fprintf(fp, "\tfloat ug%d;\n",p);
declare(beg_int, beg_float, beg_float_ptr);
float l_fact, r_fact;
l_fact = atof(ugen[p].side->in0->value);
r_fact = atof(ugen[p].side->in1->value);
if(l && r)
sprintf(cmd, "ug%d = %f * ug%d - %f * ug%d;\n",
p, l_fact, l, r_fact, r);
else if(l)
sprintf(cmd, "ug%d = %f * ug%d - %f;\n", p, l_fact, l, r_fact);
else if(r)
sprintf(cmd, "ug%d = %f - %f * ug%d;\n", p, l_fact, r_fact, r);
else
sprintf(cmd, "ug%d = 0.;\n", p);
inst.loop_list.append(cmd);
}
void unit_generator::write_mult(int p, int l, int r)
{
fprintf(fp, "\tfloat ug%d;\n",p);
declare(beg_int, beg_float, beg_float_ptr);
float l_fact, r_fact;
l_fact = atof(ugen[p].side->in0->value);
r_fact = atof(ugen[p].side->in1->value);
if(l && r)
sprintf(cmd, "ug%d = %f * ug%d * %f * ug%d;\n",
p, l_fact, l, r_fact, r);
else if(l)
sprintf(cmd, "ug%d = %f * ug%d * %f;\n", p, l_fact, l, r_fact);
else if(r)
sprintf(cmd, "ug%d = %f * %f * ug%d;\n", p, l_fact, r_fact, r);
else
sprintf(cmd, "ug%d = 0.;\n", p);
inst.loop_list.append(cmd);
}
void unit_generator::write_div(int p, int l, int r)
{
fprintf(fp, "\tfloat ug%d;\n",p);
declare(beg_int, beg_float, beg_float_ptr);
float l_fact, r_fact;
l_fact = atof(ugen[p].side->in0->value);
r_fact = atof(ugen[p].side->in1->value);
if(l && r)
sprintf(cmd, "ug%d = (%f * ug%d) / (%f * ug%d);\n",
p, l_fact, l, r_fact, r);
else if(l)
sprintf(cmd, "ug%d = (%f * ug%d) / %f;\n", p, l_fact, l, r_fact);
else if(r)
sprintf(cmd, "ug%d = %f / (%f * ug%d);\n", p, l_fact, r_fact, r);
else
sprintf(cmd, "ug%d = 0.;\n", p);
inst.loop_list.append(cmd);
}
void unit_generator::write_out(int p, int l, int r)
{
sprintf(cmd, "out[0] = ug%d;\n",l);
inst.loop_list.append(cmd);
// if mono
sprintf(cmd, "out[1] = out[0];\n");
inst.loop_list.append(cmd);
}
void unit_generator::declare(int in, int f, int p)
{
for(int i = in; i < inst.num_ints; i++)
fprintf(fp,"\tint %s;\n",inst.ints[i]);
for(i = f; i < inst.num_sfloats; i++)
fprintf(fp,"\tfloat %s;\n",inst.sfloats[i]);
for(i = p; i < inst.num_float_ptrs; i++)
fprintf(fp,"\tfloat *%s;\n",inst.float_ptrs[i]);
}
unit_generator::~unit_generator()
{
fclose(fp);
}
//*****************************************************
ugen_loc::ugen_loc(int type)
{
if(type < 20) {
size = 75;
xoffset = yoffset = 37;
}
else {
size = 36;
xoffset = yoffset = 18;
}
}
int ugen_loc::get_size()
{
return size;
}
int ugen_loc::get_xoffset()
{
return xoffset;
}
int ugen_loc::get_yoffset()
{
return yoffset;
}